/**
 * 工程名称:oms
 * 文件名称:FelBasedStockCaculator.java
 * 所属包:cn.rkylin.oms.system.stockpush.util.impl
 * 创建时间:2017年9月11日上午11:27:32
 * Copyright (c) 2017 瑞金麟(大连)信息技术有限公司 All Rights Reserved.
 * 创建人:zhanghao
 */

package cn.rkylin.oms.system.stockpush.util.impl;

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.greenpineyu.fel.FelEngine;
import com.greenpineyu.fel.FelEngineImpl;
import com.greenpineyu.fel.context.FelContext;

import cn.rkylin.oms.system.stockpush.util.AbstractStockCaculator;

/**
 * 类名:FelBasedStockCaculator <br/>
 * 作用: 基于Fel表达式引擎的库存公式计算器. <br/>
 * 创建原因: 库存公式计算器，基于Fel引擎的实现. <br/>
 * 创建时间: 2017年9月11日 上午11:27:32 <br/>
 * 
 * @author zhanghao
 * @version v1.0
 * @since JDK 1.6
 * @see
 */
public class FelBasedStockCaculator extends AbstractStockCaculator {
    private FelEngine felEngine = new FelEngineImpl();

    /**
     * 方法复写 基于Fel计算引擎计算算式.
     * 默认返回的是不带小数位的整数格式,取Math的floor整数
     * 
     * @see cn.rkylin.oms.system.stockpush.util.AbstractStockCaculator#caculate(java.lang.String,
     *      java.util.Map)
     */
    @Override
    public String caculate(String fmla, Map paramMap) {
        String returnValue = "";
        FelContext felContext = felEngine.getContext();
        // 将参数加入Fel计算引擎的上下文中
        Iterator ParamIterator = paramMap.keySet().iterator();
        while (ParamIterator.hasNext()) {
            String key = (String) ParamIterator.next();
            felContext.set(key, paramMap.get(key));
            logger.info(key+":"+paramMap.get(key).toString());
        }
        BigDecimal result = new BigDecimal("0");
        try {
            String[] array = {"{{","}}"," "};
            String[] reaplaceMent = {"","",""};
            result = new BigDecimal(felEngine.eval(StringUtils.replaceEach(fmla, array , reaplaceMent ),felContext).toString());
            returnValue = result.toString();
        }catch(Exception e) {
            logger.error("FEL计算过程出错，已自动将返回值设定为:0");
            returnValue = "";
        }finally {
            logger.info("算式："+fmla+"  计算结果:"+result);
        }
        return returnValue;
    }

}
